//
//  NSDate+Category.h
//  VIVideoPlayer
//
//  Created by lan's Mac on 2022/6/28.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

#define kDateFormateDay @"yyyy-MM-dd"
#define kDateFormateDay2 @"yyyy/MM/dd"

#define kDateFormateSecond @"yyyy-MM-dd HH:mm:ss"
#define kDateFormateMin @"yyyy-MM-dd HH:mm"

#define kDateFormateMonth @"yyyy-MM"

@interface NSDate (Category)

/// 获取当前系统时间
+ (NSString *)getCurrentTime;
/// 获取当前系统时间戳
+ (NSString *)getCurrentTimestamp;
/// 获取当前时间的零点的时间戳
+ (NSString *)getTimestampZeroString:(NSString *)str;
/// 根据字符串获取当前时间戳（YYYY-MM-dd HH:mm:ss）
+ (NSString *)getTimeStrWithString:(NSString *)str;
/// 根据字符串获取当前时间戳（YYYY-MM-dd）
+ (NSString *)getTimeStrWithStringYmd:(NSString *)str;
/// 时间戳转时间(yyyy-MM-dd)
+ (NSString *)timeWithYearMonthDayCountDown:(NSString *)timestamp;
/// 时间戳转时间(yyyy-MM-dd HH:mm:ss)
+ (NSString *)timeWithYearMonthDayHourMinSecCountDown:(NSString *)timestamp;
/// 时间戳转时间(yyyy-MM-dd)
+ (NSString *)timeStringWithTimeInterval:(NSInteger)timeInterval;

+ (NSString *)yearToSecond:(NSTimeInterval)timestamp;

///根据时间戳，格式，返回显示的时间格式
+ (NSString *)timestamp:(NSTimeInterval)timestamp dateFormatterString:(NSString *)dateFormatterString;

/// 获取今天(yyyy-MM-dd)
- (NSString *)dateDay;

/// 获取今天(yyyy/MM/dd)
- (NSString *)dateDay2;

/// 获取今天(yyyy-MM-dd HH:mm:ss)
- (NSString *)dateSecond;

/// 获取今天(yyyy-MM-dd HH:mm)
- (NSString *)dateMinute;

//将UTC日期转为本地时间字符串
//输入的UTC日期格式2013-08-03T04:53:51+0000
+ (NSString *)getLocalDateFormateUTCDate:(NSDate *)utcDate;

/// NSString -> NSDate的转化
+ (NSDate *)stringToDate:(NSString *)datestr format:(NSString *)format;

/// NSDate -> NSString的转化
+ (NSString *)dateToString:(NSDate *)date format:(nonnull NSString *)format;

///获取当前时间的月-日
+ (NSString *)getLocalDateFormateMMdd:(NSDate *)utcDate;

+ (NSDate *)replaceDateStrToUTC:(NSDate *)originDate replaceStr:(NSString *)replaceStr;

+ (NSString *)replaceDateStr:(NSDate *)originDate replaceStr:(NSString *)replaceStr;

/// 获取最近几天时间数组
/// @param startDate 当前时间
/// @param count 几天
+ (NSMutableArray *)latelyWeekTime:(NSDate *)startDate dayCount:(NSInteger)count;

/// 获取今天的日期(格式：MMdd)
+ (NSString *)getTodayStringMMdd;

/// 获取当前的日历
+ (NSCalendar *)currentCalendar;

/// 获取日历中的Components
- (NSDateComponents *)getComponents;

/// 根据格式返回NSDate
- (NSDate *)dateWithFormatter:(NSString *)formatter;

/// 比较两个日期的大小
+ (BOOL)compareDate:(NSDate*)start withDate:(NSDate*)end;

/// 比较两个日期之间相差几天
/// @param start 例：第一个日期的时间戳
/// @param end 例：第二个日期的时间戳
+ (NSInteger)compareDeviationDate:(NSString *)start withDate:(NSString *)end;

/// 是否是七天内
+ (BOOL)isWithinSevendays:(NSDate *)date;

/// 获取当前对象日期前后多少天的日期
/// @param dDays 前后多少天 (30:表示30天后  -30：表示30天前)
- (NSDate *)dateByAddingDays:(NSInteger)dDays;

/// 获取当前对象日期前后多少天的日期(创新院专用)
/// @param dDays 前后多少天 (30:表示30天后  -30：表示30天前)
/// example: 这个近三天比如当前时间是11/10 17:53，创新院指的是11/8 00：00 至 11/10 17：53；而泛全云店指的是 11/7 17：53 至11/10 17：53
- (NSDate *)cxy_dateByAddingDays:(NSInteger)dDays;

/// 获取当天的前三天
- (NSString *)datePrefix3Day;

/// 获取当天的前七天
- (NSString *)datePrefix7Day;

/// 检查选择的日期时间是否超过当前时间
/// @param startDate 选择的时间
+ (BOOL)checkCurrentDateEarlierThanStartDate:(NSDate *)startDate;

/// 判断当前时间是否在时间段内
/// @param startDate 开始时间
/// @param endDate 结束时间
/// @param currentDate 当前时间
+ (BOOL)judgeTimeByStartAndEnd:(NSDate *)startDate EndTime:(NSDate *)endDate currentDate:(NSDate *)currentDate;

/// 返回当前本地时间(会根据本地语言适配)
/// @param format 时间格式
- (nullable NSString *)stringWithFormat:(NSString *)format;


/// 对象的日期 + n年
/// @param years n年
- (NSDate *)dateByAddingYears:(NSInteger)years;


///今天开始的时间戳
+ (NSTimeInterval)dayBegin;
+ (NSString *)dayBeginSecondString;

///今天结束的时间戳
+ (NSTimeInterval)dayEnd;
+ (NSString *)dayEndSecondString;

///当前的时间戳
+ (NSTimeInterval)dayNow;
///当前的时间戳的24*3h前
+ (NSTimeInterval)dayBefore3Day;
///当前的时间戳的24*7h前
+ (NSTimeInterval)dayBefore7Day;
///当前的时间戳的n天前的时间戳
+ (NSTimeInterval)dayBeforeNDay:(NSInteger)nDay;

/// 当月的开始时间戳
+ (NSTimeInterval)monthBegin;
+ (NSString *)monthBeginSecondString;
///上个月的开始时间
+ (NSTimeInterval)lastMonthBegin;
///上个月的结束时间
+ (NSTimeInterval)lastMonthEnd;
@end

NS_ASSUME_NONNULL_END
